#include "preference.h"
#include <QFile>
#include <QDomDocument>
#include <QMessageBox>
#include <QTextStream>
#include <QDebug>

Preference * Preference::instance = NULL;

Preference::Preference(QWidget *parent) : QWidget(parent)
{
    if(!QFile::exists(preferenceFile))
    {
        createDefaultFile();
    }
    getPreferences();
}

Preference * Preference::getInstance()
{
    if(instance == NULL)
    {
        instance = new Preference();
    }
    return instance;
}

QSet<DtLibrary> Preference::getLibrary() const
{
    return library;
}

void Preference::addLibrairy(const QStringList & location)
{
    QDomDocument dom("preference_xml");
    QFile xml_doc(preferenceFile);
    if(!xml_doc.open(QIODevice::ReadOnly))
    {
        QMessageBox::warning(this, "Erreur à l'ouverture du document XML",
                             "Le document XML(c\'est le document qui contient"
                             " les préférences) n'a pas pu être ouvert."
                             " Vérifiez que le nom est le bon et que le"
                             " document est bien placé");
        return;
    }
    if (!dom.setContent(&xml_doc))
    {
        xml_doc.close();
        QMessageBox::warning(this, "Erreur à l'ouverture du document XML",
                             "Le document XML(c\'est le document qui contient"
                             " les préférences) n'a pas pu être attribué"
                             " à l'objet QDomDocument(Information pour les"
                             " développeur).");
        return;
    }
    QDomElement docElem = dom.documentElement();
    for(QStringList::ConstIterator it = location.constBegin();
        it != location.constEnd(); it ++)
    {
        DtLibrary l;
        l.setLibrary(*it);
        if(!library.contains(l))
        {
            QDomElement write_elem = dom.createElement("library");
            write_elem.setAttribute("location", (*it));
            write_elem.setAttribute("Load", 0);
            docElem.appendChild(write_elem);
            l.setLoad(false);
            library.insert(l);
        }
    }
    QString write_doc = dom.toString();
    qDebug() << write_doc;
    QFile fichier(preferenceFile);
    if(!fichier.open(QIODevice::WriteOnly))
    {
        fichier.close();
        QMessageBox::critical(this,"Erreur",
                              "Impossible d'écrire dans le document XML");
        return;
    }
    QTextStream stream(&fichier);
    stream << write_doc;
    fichier.close();
}

void Preference::createDefaultFile()
{
    QDomDocument dom("preference_xml");
    QFile xml_doc(preferenceFile);
    if(!xml_doc.open(QIODevice::WriteOnly))
    {
        QMessageBox::warning(this, "Erreur à la création du document XML",
                             "Le document XML n'a pas pu être créé."
                             );
        return;
    }
    /* Make the default value in the xml file */
    QDomElement root = dom.createElement("preference");
    dom.appendChild(root);

    QDomElement write_elem = dom.createElement("global");
    write_elem.setAttribute("debug", 1);
    root.appendChild(write_elem);
    QDomElement write_display = dom.createElement("display");
    root.appendChild(write_display);

    QDomElement write_Artist = dom.createElement("artist");
    write_display.appendChild(write_Artist);
    QDomElement art_name = dom.createElement("name");
    write_Artist.appendChild(art_name);
    art_name.setAttribute("visibility", true);
    art_name.setAttribute("position", 2);
    QDomElement art_play = dom.createElement("play");
    write_Artist.appendChild(art_play);
    art_play.setAttribute("visibility", true);
    art_play.setAttribute("position", 0);
    QDomElement art_heart = dom.createElement("heart");
    write_Artist.appendChild(art_heart);
    art_heart.setAttribute("visibility", true);
    art_heart.setAttribute("position",3);
    QDomElement art_add = dom.createElement("add");
    write_Artist.appendChild(art_add);
    art_add.setAttribute("visibility", true);
    art_add.setAttribute("position", 1);

    QString defaultValues = dom.toString();
    qDebug() << defaultValues;
    QTextStream stream(&xml_doc);
    stream << defaultValues;
    xml_doc.close();
}

void Preference::getPreferences()
{
    QDomDocument dom("preference_xml");
    QFile xml_doc(preferenceFile);
    if(!xml_doc.open(QIODevice::ReadOnly))
    {
        QMessageBox::warning(this, "Erreur à l'ouverture du document XML",
                             "Le document XML n'a pas pu être ouvert."
                             " Vérifiez que le nom est le bon et que le"
                             " document est bien placé");
        return;
    }
    if (!dom.setContent(&xml_doc))
    {
        xml_doc.close();
        QMessageBox::warning(this, "Erreur à l'ouverture du document XML",
                             "Le document XML n'a pas pu être attribué"
                             " à l'objet QDomDocument.");
        return;
    }
    QDomElement docElem = dom.documentElement();
    QDomNode n = docElem.firstChild();
    while(!n.isNull())
    {
        QDomElement e = n.toElement();
        if(e.tagName() == "global")
        {
            e.attribute("debug");
        }
        else if (e.tagName() == "library")
        {
            DtLibrary l;
            l.setLibrary(e.attribute("location"));
            l.setLoad(e.attribute("load") == 0 ? false : true);
            library.insert(l);
        }
        n = n.nextSibling();
    }
}
